"""
爬取段子页面的用户的简单信息：头像、用户名、等级
分页爬取，爬取多个用户的信息。

分析：
api 接口：https://www.qiushibaike.com/text/page/(n)
要爬取的段：<div class="author clearfix">...<div>

难点：
1.正则表达式对象的制定：可以将用户头像、用户昵称、用户等级用同一表达对象匹配出来
2.头像图片格式的获取
"""

import urllib.request
import re

# 接口
get_url = 'https://www.qiushibaike.com/text/page/'


def create_request(page):
	# url 拼接，page 为字符形式
	url = get_url + str(page)
	# 请求头
	headers = {
		'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36'
	}
	# 请求对象定制
	request = urllib.request.Request(url=url, headers=headers)
	return request


def get_response(request):
	# 发送请求，获取响应数据
	response = urllib.request.urlopen(request)
	# 读取响应数据
	resp_data = response.read().decode('utf-8')
	return resp_data


def download_user(resp_data):
	# 制定 正则表达式对象
	# 这里 src 是图片链接，alt 相当于 用户昵称
	pattern = re.compile(
		'<div class="author clearfix">.*?<img src="(.*?)" alt="(.*?)">.*?<div class="articleGender womenIcon">(.\d)',
		re.S)
	# 使用 正则对象 匹配 文档
	# findall 获取所有获取结果，结果类型为 list
	# 因为正则对象中有三个 ()，所以结果 list 元素的元组元素是三个，分别是用户头像、用户昵称，用户等级
	user_list = pattern.findall(resp_data)
	print(user_list)
	for user_tuple in user_list:
		# 用户头像图片域名
		user_head = user_tuple[0]
		# 用户昵称
		user_name = user_tuple[1]
		# 用户等级
		user_grade = user_tuple[2]
		# print(user_head)
		# print(user_name)
		# print(user_grade)

		# 获取头像图片格式
		file_type = user_head.split('.')[-1].split('?')[0]
		# 下载用户信息并保存
		# 注：存储信息的文件夹需要先手动创建
		urllib.request.urlretrieve(url='https:' + user_head,
								   filename='用户信息/{}-{}.'.format(user_name, user_grade) + file_type)


if __name__ == '__main__':
	start_page = int(input('输入起始页码：'))
	end_page = int(input('输入末尾页码：'))

	for page in range(start_page, end_page + 1):
		# 请求头对象定制
		request = create_request(page)
		# 发送请求，获取响应数据，并读取
		resp_data = get_response(request)
		# 下载数据，并获取用户信息
		download_user(resp_data)
